class Solution:
def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
def inBounds(i, j):
return 0 <= i < len(board) and 0 <= j < len(board[i])
def dfs(i, j, trie, p):
l = board[i][j]
if l not in trie:
return
p.append(l)
trie = trie[l]
if "$" in trie:
self.result.add("".join(p))
for dx, dy in ((0, 1), (0, -1), (-1, 0), (1, 0)):
di = i + dx
dj = j + dy
if inBounds(di, dj) and (di, dj) not in self.visited:
self.visited.add((di, dj))
dfs(di, dj, trie, p[:])
self.visited.remove((di, dj))
self.visited = set()
self.result = set()
trie = self.buildTrie(words)
for i in range(len(board)):
for j in range(len(board[i])):
self.visited.add((i, j))
dfs(i, j, trie, [])
self.visited.remove((i, j))
return self.result
def buildTrie(self, words):
trie = {}
head = trie
for word in words:
for letter in word:
if letter not in trie:
trie[letter] = {}
trie = trie[letter]
trie['$'] = {}
trie = head
return trie
583. Delete Operation for Two Strings | 518. Coin Change 2 |
516. Longest Palindromic Subsequence | 468. Validate IP Address |
450. Delete Node in a BST | 445. Add Two Numbers II |
442. Find All Duplicates in an Array | 437. Path Sum III |
436. Find Right Interval | 435. Non-overlapping Intervals |
406. Queue Reconstruction by Height | 380. Insert Delete GetRandom O(1) |
332. Reconstruct Itinerary | 368. Largest Divisible Subset |
377. Combination Sum IV | 322. Coin Change |
307. Range Sum Query - Mutable | 287. Find the Duplicate Number |
279. Perfect Squares | 275. H-Index II |
274. H-Index | 260. Single Number III |
240. Search a 2D Matrix II | 238. Product of Array Except Self |
229. Majority Element II | 222. Count Complete Tree Nodes |
215. Kth Largest Element in an Array | 198. House Robber |
153. Find Minimum in Rotated Sorted Array | 150. Evaluate Reverse Polish Notation |